開始卡...卡...卡關了
Check the admin scratchpad! https://2019shell1.picoctf.com/problem/32267/ or http://2019shell1.picoctf.com:32267
試著偷看 admin 的記事本!
What is that cookie?
Have you heard of JWT?
網頁有一個能輸入使用者名稱的欄位值
但是輸入 admin 的話會被拒絕使用
嘗試注入 SQL: admin' -- 也失敗
起手式: 打開開發者工具,切換到”Cookies” 發現有一個 jwt 的設定值
Elements 頁面的網頁原始碼則有幾個連結,其一是JWT。進入網站後將Cookie 中的 jwt 內容貼上
可以看到解出的內容(payload)就有 user 的名稱。這裡我們改為 admin 後,token 會立即更新,先將此值複製起來...
回到網頁,切換到 Cookies 分頁,將得到的新 token 值貼上去後...
重新整理,果然就得到...錯誤?!
嗯,回到 jwt 網站反覆測試後,會發現 payload 改過的值就算再改回來,還是得不到原來的 token ,因此一定是少了哪裡的資訊。詳細看 jwt 的網頁的右下方,會發現其實還有一個 secret 值,而這個值就是在加密時會帶上的神秘參數,若沒有指定的話會結成網頁驗証失敗。
因此可以推測本題的重點除了 jwt 的解碼之外,破解 secret 值也是關鍵之一。
回到頁面的資訊,除了 jwt 的連結外,最下方也有一個神秘的John 連結。John 是一個密碼破解的工具,配合 HINT 來看,整個流程應該就是要破解 secret 值後,修改 payload 再 encdoe 成 user: admin 的 jwt偽裝登入。
google “john jwt”可以得知Johne的使用方法,其中參數可以指定加密模式以及字典檔。
加密模式在之前丟入 jwt 網站時可得知為 HS256,使用以下指令等待許久後即可破解出 secret 值為 ilovepico。
john jwt.txt --format=HMAC-SHA256
Created directory: /home/YOURNAME/.john
Using default input encoding: UTF-8
Loaded 1 password hash (HMAC-SHA256 [password is key, SHA256 512/512 AVX512BW 16x])
Will run 4 OpenMP threads
Proceeding with single, rules:Single
Press 'q' or Ctrl-C to abort, almost any other key for status
Almost done: Processing the remaining buffered candidate passwords, if any.
Proceeding with wordlist:/usr/share/john/password.lst, rules:Wordlist
Proceeding with incremental:ASCII
ilovepico (?)
1g 0:01:42:15 DONE 3/3 (2020-10-07 04:35) 0.000162g/s 15210Kp/s 15210Kc/s 15210KC/s tmjndhad2..iloviptny
Use the "--show" option to display all of the cracked passwords reliably
Session completed
最後重複之前更改的步驟,在 jwt 網站的 secret 填入 ilovepico ,再修改 payload 即可得到正確的 token。
回到網站,將Cookies 中 jwt 的值替後後,即可以 admin 登入,在 scratchpad 得到 flag。
後記: 字典檔可以自行產生或是使用 kali 系統內建的檔案,如本題不是故意刁難的情況下,可以google “kali 字典檔” 使用較小的rockyou.txt 迅速破解。
john jwt.txt --wordlist=/usr/share/wordlists/rockyou.txt --format=HMAC-SHA256
picoCTF{jawt_was_just_what_you_thought_6ba7694bcc36bdd4fdaf010b2ec1c2c3}